package modelo;

public class Calle extends Bloque {

	public Calle(Direccion sentido, Coordenada posicion) {
		super(sentido, posicion);
	}
	
	@Override
	public void entrar(Auto auto) {
		try {
			this.acquireInterseccion(auto);
			this.getMutex().acquire();
			System.out.println("Auto " + auto.getIdAuto() + " Entro al bloque " + this.getPosicion());
			this.setAuto(auto);
			auto.setBloque(this);
			this.notificar();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void liberar(Auto auto) {
		System.out.println("Auto " + auto.getIdAuto() + " libero bloque " + this.getPosicion());
		this.setAuto(null);
		this.notificar();
		this.getMutex().release();
		this.releaseInterseccion(auto);
	}
	
	/**
	 * Adquiere el semaforo de la interseccion si el auto esta entrando a la interseccion.
	 * Evita el posible deadlock cuando hay 4 autos dentro de la interseccion.
	 * 
	 * @param auto El auto que esta actuando
	 * @throws InterruptedException
	 */
	protected void acquireInterseccion(Auto auto) throws InterruptedException {
		if (this.getInterseccion() && !auto.getBloque().getInterseccion()) {
			Mundo.SEM_INTERSECCION.acquire();
		}
	}
	
	/**
	 * Libera el semaforo de la interseccion si el auto esta dejando la interseccion.
	 * 
	 * @param auto El auto que esta actuando
	 */
	protected void releaseInterseccion(Auto auto) {
		if (this.getInterseccion() && !auto.getBloque().getInterseccion()) {
			Mundo.SEM_INTERSECCION.release();
		}
	}

}
